package com.work.demo.utils;

import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.text.csv.CsvUtil;
import cn.hutool.core.text.csv.CsvWriter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;

/**
 * @author LinYa
 */
public class BaseFileUtil {

	private static final Logger logger = LoggerFactory.getLogger(BaseFileUtil.class);

	/**
	 * @Description: 获取流文件
	 * @Param: [ins, file]
	 * @return: void
	 * @Author: LinYa
	 * @Date: 2021/5/25
	 */
	public static void inputStreamToFile(InputStream ins, File file) {
		try {
			OutputStream os = new FileOutputStream(file);
			int bytesRead;
			byte[] buffer = new byte[8192];
			while ((bytesRead = ins.read(buffer, 0, 8192)) != -1) {
				os.write(buffer, 0, bytesRead);
			}
			os.close();
			ins.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * 删除本地临时文件
	 *
	 * @param file
	 */
	public static void deleteTempFile(File file) {
		if (file != null) {
			File del = new File(file.toURI());
			del.delete();
		}

	}

	public static String createCsvFile(String filePath) throws IOException {
		File csvFile = null;

		csvFile = new File(filePath);

		File parentFile = csvFile.getParentFile();

		if (parentFile != null && !parentFile.exists()) {
			parentFile.mkdirs();
		}

		csvFile.createNewFile();

		return csvFile.getPath();
	}

//    public static File multipartFileToFile(MultipartFile file) throws Exception {
//        File toFile = null;
//        if ("".equals(file) || file.getSize() <= 0) {
//            throw new Exception(ExceptionEnum.CODE10001.getDescription());
//        } else {
//            InputStream ins;
//            ins = file.getInputStream();
//            String fileNewName = file.getOriginalFilename();
//            fileNewName = URLEncoder.encode(fileNewName, "UTF-8");
//            fileNewName = new String(fileNewName.getBytes(StandardCharsets.UTF_8), "ISO8859-1");
//            logger.info("导入时格式化文件名称,原文件名称：{},格式化后的文件名称：{}", file.getOriginalFilename(), fileNewName);
//            toFile = new File(Objects.requireNonNull(fileNewName));
//            BaseFileUtil.inputStreamToFile(ins, toFile);
//            ins.close();
//        }
//        return toFile;
//    }

	/**
	 * @Description: 在线打开方式 下载
	 * @Param: [filePath, response, fileNewName]
	 * @return: void
	 * @Author: LinYa
	 * @Date: 2021/5/26
	 */
	public static void downLoad(File file, HttpServletRequest request, HttpServletResponse response, String fileNewName) throws Exception {
		OutputStream out = response.getOutputStream();
		BufferedInputStream br = new BufferedInputStream(new FileInputStream(file));
		byte[] buf = new byte[1024];
		int len = 0;
		response.reset(); // 非常重要
		response.setContentType("application/octet-stream");
		fileNewName = URLEncoder.encode(fileNewName, "UTF-8");
		fileNewName = new String(fileNewName.getBytes(StandardCharsets.UTF_8), "ISO8859-1");
		response.setHeader("Content-Disposition", "attachment; filename=" + fileNewName + ".csv");
		//允许所有请求
		response.setHeader("Access-Control-Allow-Origin", request.getHeader("origin"));
		//该字段可选。它的值是一个布尔值，表示是否允许发送Cookie。
		// 默认情况下，Cookie不包括在CORS请求之中。设为true，
		// 即表示服务器明确许可，Cookie可以包含在请求中，一起发给服务器。
		// 这个值也只能设为true，如果服务器不要浏览器发送Cookie，删除该字段即可。
		response.setHeader("Access-Control-Allow-Credentials", "true");
		//允许哪些请求方式
		response.setHeader("Access-Control-Allow-Methods", "POST, PUT, GET, OPTIONS, DELETE");
		response.setHeader("Access-Control-Expose-Headers", "Content-Disposition");
		//指定本次预检请求的有效期
		//浏览器的同源策略:出于安全考虑,浏览器会向所请求的服务器发起两次请求
		//第一次是浏览器使用OPTIONS方法发起一个预检请求，第二次才是真正的异步请求
		//第一次预检请求服务器是为了验证是否允许该跨域请求，如果允许，则执行第二次请求，如果不允许，则拦截第二次请求
		response.setHeader("Access-Control-Max-Age", "5000");
		//制定浏览器发送请求时，会额外发送的头信息字段
		response.setHeader("Access-Control-Allow-Headers", "smc-platform-token, Origin, No-Cache, X-Requested-With, If-Modified-Since, Pragma, Last-Modified, Cache-Control, Expires, Content-Type, X-E4M-With,Authorization,Token");
		//执行下一个过滤器或者业务处理器
		//如果在doFilter()方法中，不写chain.doFilter()，业务无法继续往下处理

		while ((len = br.read(buf)) > 0) {
			out.write(buf, 0, len);
		}
		br.close();
		out.close();
	}

	public static File listToFile(List<String> phoneList, String filePath) throws IOException {
		String[] strings = new String[1];
		strings[0] = "phone";
		List<String[]> commentList = new ArrayList<>();
		if (CollectionUtil.isNotEmpty(phoneList)) {
			phoneList.forEach(phone -> {
				String[] csvComments = new String[1];
				csvComments[0] = phone;
				commentList.add(csvComments);
			});
		}
		//写入的文件地址
		String csvFile = BaseFileUtil.createCsvFile(filePath);
		//开始写数据
		CsvWriter writer = CsvUtil.getWriter(csvFile, StandardCharsets.UTF_8);
		writer.write(strings);
		writer.write(commentList);
		return FileUtil.file(filePath);
	}
}
